<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="U0DtQ" id="U0DtQ"><span data-lake-id="u154b555d" id="u154b555d">典型回答</span></h1>
  <p data-lake-id="udc3ce81f" id="udc3ce81f"><br></p>
  <p data-lake-id="u915c1be1" id="u915c1be1"><span data-lake-id="u0662fac4" id="u0662fac4">ISR，是In-Sync Replicas，同步副本的意思。</span></p>
  <p data-lake-id="udc90e878" id="udc90e878"><span data-lake-id="u4ab4c951" id="u4ab4c951">​</span><br></p>
  <p data-lake-id="u042d1008" id="u042d1008"><span data-lake-id="u1a7c6539" id="u1a7c6539">在Kafka中，每个主题分区可以有多个副本(replica)。。ISR是与主副本（Leader Replica）保持同步的副本集合。ISR机制就是用于确保数据的可靠性和一致性的。</span></p>
  <p data-lake-id="u6259d4ce" id="u6259d4ce"><span data-lake-id="uc6e22554" id="uc6e22554">​</span><br></p>
  <p data-lake-id="u41273671" id="u41273671"><span data-lake-id="u3265a7c7" id="u3265a7c7">当消息被写入Kafka的分区时，它首先会被写入Leader，然后Leader将消息复制给ISR中的所有副本。只有当ISR中的所有副本都成功地接收到并确认了消息后，主副本才会认为消息已成功提交。这种机制确保了数据的可靠性和一致性。</span></p>
  <p data-lake-id="u04eeacf1" id="u04eeacf1"><span data-lake-id="u80147eb8" id="u80147eb8">​</span><br></p>
  <h1 data-lake-id="ZRFVU" id="ZRFVU"><span data-lake-id="u61d971f7" id="u61d971f7">扩展知识</span></h1>
  <p data-lake-id="u2905e63d" id="u2905e63d"><br></p>
  <h2 data-lake-id="CVwBG" id="CVwBG"><span data-lake-id="ub34f45b5" id="ub34f45b5">ISR列表维护</span></h2>
  <p data-lake-id="u9b65a139" id="u9b65a139"><br></p>
  <p data-lake-id="u00b23af7" id="u00b23af7"><span data-lake-id="ud2af91cc" id="ud2af91cc">在Kafka中，ISR（In-Sync Replicas）列表的维护是通过副本状态和配置参数来进行的。具体的ISR列表维护机制在不同的Kafka版本中有所变化。</span></p>
  <p data-lake-id="u0eff792f" id="u0eff792f"><span data-lake-id="u543e4138" id="u543e4138">​</span><br></p>
  <h3 data-lake-id="H1paG" id="H1paG"><span data-lake-id="uec751814" id="uec751814">before 0.9.x</span></h3>
  <p data-lake-id="uc6ed6cd6" id="uc6ed6cd6"><br></p>
  <p data-lake-id="u951f47f6" id="u951f47f6"><span data-lake-id="u1147bb4c" id="u1147bb4c">在0.9.x之前的版本，Kafka 有一个核心的参数：</span><code data-lake-id="u95e4bbe5" id="u95e4bbe5"><span data-lake-id="uf29bd4e0" id="uf29bd4e0">replica.lag.max.messages</span></code><span data-lake-id="ubf0348d0" id="ubf0348d0">，表示如果Follower落后Leader的消息数量超过了这个参数值，就认为Follower就会从ISR列表里移除。</span></p>
  <p data-lake-id="u6aab5ee7" id="u6aab5ee7"><span data-lake-id="ua428b6b8" id="ua428b6b8">​</span><br></p>
  <p data-lake-id="u8318a34d" id="u8318a34d"><span data-lake-id="uda6b4110" id="uda6b4110">但是，基于</span><code data-lake-id="ud52feffd" id="ud52feffd"><span data-lake-id="u4131e5fe" id="u4131e5fe">replica.lag.max.messages</span></code><span data-lake-id="u70290f31" id="u70290f31">这种实现，在瞬间高并发访问的情况下会有问题：比如Leader瞬间接收到几万条消息，然后所有Follower还没来得及同步过去，此时所有follower都会被踢出ISR列表。</span></p>
  <p data-lake-id="u310bd81a" id="u310bd81a"><br></p>
  <h3 data-lake-id="Rj0Or" id="Rj0Or"><span data-lake-id="u66c06251" id="u66c06251">after 0.9.x</span></h3>
  <p data-lake-id="u6bc3f466" id="u6bc3f466"><br></p>
  <p data-lake-id="u174450c6" id="u174450c6"><span data-lake-id="u1b556159" id="u1b556159">Kafka从0.9.x版本开始，引入了</span><code data-lake-id="u4710ea1f" id="u4710ea1f"><span data-lake-id="u55da5a2d" id="u55da5a2d">replica.lag.max.ms</span></code><span data-lake-id="uaccf28f9" id="uaccf28f9">参数，表示如果某个Follower的LEO（latest end offset）一直落后Leader超过了10秒，那么才会被从ISR列表里移除。</span></p>
  <p data-lake-id="u7c057861" id="u7c057861"><span data-lake-id="uc96c7c03" id="uc96c7c03">​</span><br></p>
  <p data-lake-id="u707bee5e" id="u707bee5e"><span data-lake-id="udee84f4e" id="udee84f4e">这样的话，即使出现瞬间流量，导致Follower落后很多数据，但是只要在限定的时间内尽快追上来就行了。</span></p>
  <p data-lake-id="u7605a742" id="u7605a742"><span data-lake-id="u13ce55c3" id="u13ce55c3">​</span><br></p>
  <p data-lake-id="ue35dcfe4" id="ue35dcfe4"><span data-lake-id="ubcc3cfac" id="ubcc3cfac">​</span><br></p>
 </body>
</html>